13 UART实验
up的视频讲解把字节、字符与串口波形联系起来,完成字符串发送和中断接收。
up视频里的实验代码: 👣串口实验代码
CH340驱动: 🔧CH340串口驱动安装
🔤串口重定向函数
#include <stdio.h>
// printf输出重定向
int fputc(int ch, FILE *f)
{
uint8_t temp = ch;
HAL_UART_Transmit(&huart1, &temp, 1, HAL_MAX_DELAY);
return ch;
}
// scanf / getchar 输入重定向
int fgetc(FILE *f)
{
uint8_t ch = 0;
HAL_UART_Receive(&huart1, &ch, 1, HAL_MAX_DELAY);
return ch;
}
✉️ UART通信实验原理
STM32 使用 UART,电脑端通过 USB 接入,两者由 CH340 桥接。线路传输的是字节,串口助手再按选择的显示方式解释它们。

按 ASCII 解释时,十进制 65 表示字符 A,54 表示字符 6。打印字符能够直接显示;回车、换行等控制字符则影响显示位置。
1 💻串口数组/指针发送实验
1.1 实验连接
PA9 接 CH340 的 RXD,双方 GND 相连;接收实验还需要 TXD 接 PA10。

1.2 实验原理
一个字符对应一个编码值,一串字符则需要连续的存储空间。数组保存字符本身,指针保存地址,两者不能当作同一种对象理解。

字符串 Hello 有五个可见字符,C 字符串末尾还需要结束符 \0。发送长度应结合具体存储方式理解,因此代码分别使用 sizeof 和 strlen。

变量转换成可读文本时,格式字符串分成普通文字、格式占位与转义序列。例如 %d 表示相应整数的格式,\r\n 表示回车和换行。

printf() 输出格式化文本,需要通过串口重定向连接到 UART;sprintf() 则把格式化结果写入指定缓冲区。缓冲区中存放的是字符,不是把原数值的二进制表示直接发送出去。
1.3 CubeMX配置
USART1选择Asynchronous,参数默认就好

1.4 实验代码
全局
#include <stdio.h>
main()
char p1[] = "Hello";
char* p2 = "world\r\n";
while(1)里面
HAL_UART_Transmit(&huart1,p1,sizeof(p1)-1,1000);
HAL_UART_Transmit(&huart1,p2,strlen(p2),1000);
printf("Hello World\r\n");
HAL_Delay(50);
2 📨串口中断接收实验
2.1 实验连接
在发送实验接线基础上补接CH340 TXD到PA10;PA9接CH340 RXD,GND共地。
2.2 实验原理
先启动一个字节的中断接收。接收完成后,HAL 调用回调函数,程序重新开启下一次接收;主循环读取 rx,决定是否执行相应动作。
程序用字符 '1' 作为判断条件。串口助手应以字符方式发送它,让接收数据与代码中的字符比较对应起来。
2.3 CubeMX配置
配置UART时已包含发送
2.4 实验代码
全局
#include <stdio.h>
char rx = 0;
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
HAL_UART_Receive_IT(&huart1,&rx,1);
}
main()
HAL_UART_Receive_IT(&huart1,&rx,1);
while(1)里面
if(rx == '1')
{
printf("Hello World\r\n");
}